S−OS SWORD Ver.2.0 ――――――――――――――――――――――――――――――――――――――― Oh!mz 1986年 2月号掲載 MZ−80K/C 01200H−02AFFH S:01200H コールドスタート 01FFDH ホット スタート 01FFAH 起動方法 モニタからロード ――――――――――――――――――――――――――――――――――――――― 皆さんから、S−OS“MACE”のバージョンアップ、ディスク対応、 そして再掲載などの熱い要望が実を結んで完成した S−OS“SWORD”です。 いってみればわが子同然。 愛情を持って、しかも厳しく、そして大きく育てていきたいですね。 ・−−−−−−−−−−−−−−−−−・ |共通システムS−OSとは     | ・−−−−−−−−−−−−−−−−−・ S−OSの動作について説明しましょう。 図1のメモリマップを見てください。 まず、0000Hから各機種が持っているBIOS (モニタ、IOCS)が始まります。 ここには、画面に文字をプリントしたり、 キーボードから文字を取り込んだりするルーチンが詰まっています。 当然各機種専用ですから、サブルーチンをコールする際の条件、 リターンしてくるときのレジスタの状態などは 個々に異なっています。 機能が微妙に違っているため、同じように使えそうでも まったく同じには使えないルーチンもあります。 またそれぞれのサブルーチンが始まるアドレスは まるっきりバラバラです。 通常、他機種用のプログラムが動かない(暴走する)のは これらの理由によります。 BIOSの後ろにS−OSがあります。 S−OSでは、各々のBIOSで異なっているサブルーチンの 開始アドレスや、コール、リターン時の条件を共通化しています。 そして、アプリケーション側では S−OSのサブルーチンをコールすることで、 プログラムの共通化が図られるのです。 いわば、アプリケ−ションとBIOSの架け橋といったところですね。 図1 メモリマップ ・−−−−−−−−−−−−−−−−−−−−−−・ |                      | |   0000H・−−−−−−−−−・     | |      | BIOS    |     | |      |−−−−−−−−−|     | |      | S−OS    |     | |      |−−−−−−−−−|     | |      |ジャンプテーブル |     | |   2100H|−−−−−−−−−|     | |      |DOSモジュール |     | |   2B00H|−−−−−−−−−|     | |      |ディスクI/O  |     | |   2E00H|−−−−−−−−−|     | |      |DOSワークエリア|     | |   3000H|−−−−−−−−−|     | |      |ユーザーエリア  |     | |      |         |     | |      〜         〜     | |      〜         〜     | |      |         |     | |      |         |     | |      |         |     | | (#MEMMAX) ・−−−−−−−−−・     | |                      | ・−−−−−−−−−−−−−−−−−−−−−−・ 具体的に説明をしましょう。 今、改行をしたいとします。 S−OSの改行サブルーチン#LTNL(1FEEH番地)をコールすると、 S−OSは各機種BIOS中の改行ルーチンをコールします。 BIOSによっては保存することになっている レジスタを壊してしまうものもあるので、 そういう場合はレジスタの値が壊されないような処理もしています。 また、各BIOSで異なっているワークエリアのアドレスも、 同じ働きをするワークをS−OS中に持つことによって解決しています。 (#DTADR)などはそのよい例です。 S−OSに続いてDOSモジュールがあります。 これは今回のバージョンアップで追加された部分で、 ディスク処理に必要なサブルーチンはすべてここに入っています。 実際にディスクアクセスを行うのはディスクI/Oで、 これは2B00H以降に入ります。 そして、3000H以降がユーザーエリアです。 アプリケーションプログラムやユーザーが自作したプログラムは ここに入るわけです。 メモリの上限は(#MEMAX)に入っています。 機種によって値が違うのは、共通ワークエリアの置かれているアドレスや、 搭載しているRAMの量によるものです。 ・−−−−−−−−−−−−−−−−−・ |S−OSのバージョンアップ    | ・−−−−−−−−−−−−−−−−−・ 今回発表するS−OS“SWORD”は皆さんから届いた さまざまな意見・提案をもとに検討を加え 共通システムの機能を拡張するとともに、 ディスク対応にしたものです。 S−OS“SWORD”では、使える文字を 従来の英大文字・数字から、カナ・英小文字にまで広げました。 また、0CH、0DHだけであったコントロールコードに加え、 カーソル移動もサポートしています。 たとえばリスト1のようにすれば、画面がクリアされ座標(1,1)から 「Hello !」と表示されます。 詳しくは、表1のS−OSアスキーコード表を参照してください。 ただし、MZ−80K/C/1200は英小文字は使えません。 また、カーソル点滅1文字入力、ロケーションの指定、 画面上のキャラクタ取り込みなど、便利なルーチンを追加しました。 もっとも要望の多かったのが、 S−OSをディスク対応に、というものでした。 お待たせしました。 “SWORD”では4ドライブをサポートしています。 同時に、これまで「簡易」でしかなかったS−OSのモニタも 大幅に拡張してあります(表2)。 また、これまで(#DVSW)を直接書き換えるしかなかったデバイス変更も、 サブルーチンをコールすれば書き換わるようにしてあります。 S−OSのモニタからならDVコマンドて簡単に変更することができます。 なお、MZ−80K/C/1200は 2Dのディスクがサポートされていませんので、 デイスク対応は見合わせました。 リスト1 メッセージの表示(アドレスは任意) ・−−−−−−−−−−−−−−−−−−−−−−・ | CD E2 1F CALL #MPRNT | | 0C 1C 1F DEFB 0CH:1CH:1FH | | 48 65 6C 6C DEFM "Hello !" | | 6F 20 21 | | 00 DEFB 0 | | C9 RET | ・−−−−−−−−−−−−−−−−−−−−−−・ 表1 S−OSアスキーコード ・−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−・ |\|0|1|2|3|4|5|6|7|8|9|A|B|C|D|E|F| |−+−+−+−+−+−+−+−+−+−+−+−+−+−+−+−+−| |0|nl| |SP|0|@|P| |p| | | | |タ|ミ| | | |−+−+−+−+−+−+−+−+−+−+−+−+−+−+−+−+−| |1| | |!|1|A|Q|a|q| | |。|ア|チ|ム| | | |−+−+−+−+−+−+−+−+−+−+−+−+−+−+−+−+−| |2| | |”|2|B|R|b|r| | |「|イ|ツ|メ| | | |−+−+−+−+−+−+−+−+−+−+−+−+−+−+−+−+−| |3| | |#|3|C|S|c|s| | |」|ウ|チ|ム| | | |−+−+−+−+−+−+−+−+−+−+−+−+−+−+−+−+−| |4| | |$|4|D|T|d|t| | | |エ|ト|ヤ| | | |−+−+−+−+−+−+−+−+−+−+−+−+−+−+−+−+−| |5| | |%|5|E|U|e|u| | | |オ|ナ|ユ| | | |−+−+−+−+−+−+−+−+−+−+−+−+−+−+−+−+−| |6| | |&|6|F|V|f|v| | |ヲ|カ|二|ヨ| | | |−+−+−+−+−+−+−+−+−+−+−+−+−+−+−+−+−| |7| | |’|7|G|W|g|w| | |ァ|キ|ヌ|ラ| | | |−+−+−+−+−+−+−+−+−+−+−+−+−+−+−+−+−| |8| | |(|8|H|X|h|x| | |ィ|ク|ネ|リ| | | |−+−+−+−+−+−+−+−+−+−+−+−+−+−+−+−+−| |9| | |)|9|I|Y|i|y| | |ゥ|ケ|ノ|ル| | | |−+−+−+−+−+−+−+−+−+−+−+−+−+−+−+−+−| |A| | |*|:|J|Z|j|z| | |ェ|コ|ハ|レ| | | |−+−+−+−+−+−+−+−+−+−+−+−+−+−+−+−+−| |B| |BK|+|;|K|[|k|■| | |ォ|サ|ヒ|ロ| | | |−+−+−+−+−+−+−+−+−+−+−+−+−+−+−+−+−| |C|CL|→|,|<|L|\|l| | | |ャ|シ|フ|ワ| | | |−+−+−+−+−+−+−+−+−+−+−+−+−+−+−+−+−| |D|CR|←|−|=|M|]|m|■| | |ュ|ス|ヘ|ン| | | |−+−+−+−+−+−+−+−+−+−+−+−+−+−+−+−+−| |E| |↑|.|>|N|^|n| | | |ョ|セ|ホ|゛| | | |−+−+−+−+−+−+−+−+−+−+−+−+−+−+−+−+−| |F| |↓|/|?|O| |o|π| | |ッ|ソ|マ|゜| | | ・−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−・  nl=nul、CL=CLS、BK=BRK            (X1では5CHは¥) 表2 S−OS“SWORD”モニタコマンド        ([ ]は省略可能であることを示す) ・−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−・ |#D [〈デバイス名〉:]                   | |   〈デバイス名〉で指定されたデバイスのディレクトリを    | |   表示する。省略時はデフォルトのディレクトリ。       | |                                | |#DV〈デバイス名〉:                     | |   デフォルトデバイスを変更する。              | |                                | |#J〈アドレス〉                        | |   アドレスから始まるプログラムをコールする。        | |   サブルーチン中のRETで                 | |   S−OSのモニタにリターンできる。            | |                                | |#K〈ファイル名〉                       | |  〈ファイル名〉で与えられたファイルを消去する。       | |                                | |#L〈ファイル名〉[:〈ロードアドレス〉]           | |   〈ファイル名〉で与えられたファイルを           | |   〈ロードアドレス〉へロードする。             | |   ロードアドレスが省略されたときには、           | |   セーブしたときのアドレスヘロードする。          | |                                | |#M                              | |  各機種のマシン語モニタのホットスタートヘジャンプする。   | |                                | |#N〈ファイル名1〉:〈ファイル名2〉             | |   〈ファイル名1〉を〈ファイル名2〉に変更する。      | |   なお、〈フフイル名2〉のデバイス指定は不要。       | |                                | |#S〈ファイル名〉:〈開始番地〉:〈終了番地〉[:〈実行番地〉]| |   〈開始番地〉から〈終了番地〉までを            | |   〈ファイル名〉でセーブする。               | |                                | |#ST〈ファイル名〉:P または :R             | |   〈ファイル名〉で指定されたファイルに           | |   ライトプロテクトをかける。                | |   その後は同一ファイルのセーブ、消去ができなくなる。    | |   プロテクトをはずすにはRを指定。             | |                                | |#W(MZ−80K/C/1200/700/1500を除く)   | |   画面の40字、80字モードを切り替える。         | |                                | |#!                              | |   ブートコマンド。                     | |                                | ・−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−・ ディスクフォーマット ディスクのフォーマットはHuBASICと同じにしました。 つまり、S−BASICと比べるとディスクの表裏が逆、 記録されるデータはビットが反転しています。 これは、現在S−OSを移植中のマシンとの関係も合わでて、 こちらのほうが一般的かつ合理的であると判断したからです。 ディスクの管理にはレコードを単位として採用。 1レコードは1セクタに当たり、レコードナンバーは0〜1279の値をとります。 #DRDSB、#DWTSBを直接コールして使用する場合には注意してください。 ディスク上のファイルはクラスタ単位にセーブされています。 1クラス夕は16レコードを採用しました。 テープとディスクヘの対応 テープ、ディスク、両方に対応するために フラグを使い分けたサブルーチンがあります。  自分でプログラムを組むときのために解説を加えておきましょう。 #ROPENは次のような特徴を持っています。 ディスクに対するオペレーションはゼロフラグをセットしてリターンし、 テープに対するオペレーションは、 先に#FILEでセットしたファイル名と読み込んだ インフォメーションブロックの内容が一致しないときのみノンゼロで帰る。 この性質を利用してリスト2のようにプログラムを組めぱ、 同一のプログラムでディスクとテープを扱うことができます。 リスト2 テープ/ディスクからのロード ・−−−−−−−−−−−−−−−−−−−−−−・ | CD 09 20 LOOP CALL #ROPEN | | DA 33 20 JP C,#ERROR | | C8 RET Z | | CD 9D 1F CALL #FPRNT | | 18 F4 JR LOOP | ・−−−−−−−−−−−−−−−−−−−−−−・ ファイルの扱い方 ファイルネームは、 「デバイス名」、「ファイルネーム(13文字)」、「拡張子」から成り、 書式は次のとおりです。  [デバイス:]ファイル名[.拡張子]         [ ]内は省略することが可能です。 デバイス記号とその意味は表3のとおりで、 デバイス名が省略されたときはデフォルトに従います。 ファイル操作をするプログラムを作るときは、 以ドの手順に従って処理を行ってください。  ロード/セーブ方法    1 #FILEをコール    2 #ROPEN/#WOPENをコール    3 #RDD/#WRDをコール  リネーム/キル/セット/リセット方法    1 #FILEをコール    2 それぞれのサブルーチンをコール いずれの場合も、最初に#FILEをコールすることと、 ロードセーブの場合はオープンすることを忘れないでください。 独自にインフォメーションブロックに書き込むような方法を使用した場合、 将来のバージョンアップ時における動作は保障できません。 表3 デバイス名 ・−−−−−−−−−−−−−−−−−・ |A|               | |B|ディスクドライブ       | |C|               | |D|               | |−+−−−−−−−−−−−−−−−| |E|               | |||リザーブ           | |L|               | |−+−−−−−−−−−−−−−−−| |T|共通フォーマットテープ    | |S|各システムフォーマットテープ | |Q|クイックディスク       | ・−−−−−−−−−−−−−−−−−・ エラーについて またアプリケーションなどでエラー内容を正確に知ることができるようにと考えて、 エラー番号を取り入れました。 サブルーチン中でエラーが発生したときには、キャリフラグを立て、 Aレジスタにエラー番号を入れてリターンしてくるようになっています。 この番号を調べることによって、ユーザーは何のエラーか知ることができるわけです。 また、エラー発生時にAレジスタを壊さずに#ERRORをコールすれば、 エラーメッセージを表示することができます。 エラー番号とエラーメッセージ、エラー内容の対照表を表4に示しておきます。 表4 エラーメッセージ ・−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−・ |No|  メッセージ   |        内     容         | |−+−−−−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−| |1|Device I/O Error | 入出力時にエラーが発生した          | |−+−−−−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−| |2|Device Offline | デバイスがつなかっていない          | |−+−−−−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−| |3|Bad File Descripter | ファイルディスクリプタが間違っている     | |−+−−−−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−| |4|Write Protected | ライトプロテクトがかかっている        | |−+−−−−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−| |5|Bad Record | レコードナンバーに間違いがある        | |−+−−−−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−| |6|Bad File Mode | アトリビュートが違う             | |−+−−−−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−| |7|Bad Allocation Table| ファットエラー                | |−+−−−−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−| |8|File not Found | ファイルが見つからない            | |−+−−−−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−| |9|Device Full | ディスクが一杯                | |−+−−−−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−| |10|File Aready Exists | すでに同名のファイルが登録されている     | |−+−−−−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−| |11|Reserved Feature | 現在リザーブされている            | |−+−−−−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−| |12|File not Open | ファイルをオープンせずに読み書きしようとした | |−+−−−−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−| |13|Syntax Error | 文法間違い                  | |−+−−−−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−| |14|Bad Data | 正しい引き数ではない             | ・−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−・ 表5 S−OSのサブル−チン        (※印は新規ルーチン、●印は機能が拡張・変更されたもの) ・−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−・ |ルーチン名 |        サブルーチンの機能          |レジスタ| |(アドレス) |                           | 破壊 | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#COLD  |S-OSのコールドスタート。初期設定後メッセージを出力し、ワークエリアUSRに| ―  | |(1FFDH) |格納されているアドレスにジャンプする。 |    | |    |USRには初期値として#HOTの3アドレスが格納されている。 |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#HOT  |S-OSのモニタになっており、プロント#が出てコマンド入力待ちに | ―  | |(1FFAH) |なる。                        |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#VER |HLレジスタにS-OSの機種とバージョンを返す。         | HL | |(1FF7H) |Hレジスタは機種を表しており、 |    | | |上位4ビットで機種の系列を示し、 |    | |    |下位4ビットで系列内の機種番号を示す。 |    | |    | 上位 下位 |    | |    |  0  0 MZ−80K/C/1200 |    | |    |  0  1 MZ−700 |    | |    |  0  2 MZ−1500 |    | |    |  1  0 MZ−80B |    | |    |  1  1 MZ−2000/2200 |    | |    |  2  0 X1/C/D/F/turbo |    | |    |LレジスタはS-OSバージョンを示しており、今後各種パッケージを |    | |    |追加したりした場合のS-OSのバージョンをチェックできるように |    | |    |する。基本的にS-OSに依存しながらも機種ごとに特別な |    | |    |サブルーチンが必要な場合に、ソフトウェア上で機種をチェックして |    | |    |プログラムの共通化を図ったり、S-OSのバージョンをチェックすること|    | |    |でS-OS内の拡張ル−チンが使用できるかどうかを |    | |    |知ることができる。 |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#PRINT |Aレジスタをアスキーコードとみなし表示する(1文字表示) | F  | |(1FF4H) | |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#PRINTS |スペースをひとつ表示する。 | F  | |(1FF1H) | |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#LTNL |改行する。 | なし | |(1FEEH) | |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#NL |カーソルが先頭になければ改行する。 | なし | |(1FEBH) | |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#MSG |DEレジスタの示すアドレスから0DHがあるまでアスキーコードとみなし | F  | |(1FE8H) |文字列を表示する。 |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#MSX |DEレジスタの示すアドレスから00Hがあるまでアスキーコードとみなし | F  | |(1FE5H) |文字列を表示する。                  |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#MPRINT |これをコールした次のアドレスから00Hがあるまでアスキーコード   | AF | |(1FE2H) |とみなし文字列を表示する。 | DE | | | 例) CALL #MPRINT |    | | | DM #MESSAGE" |    | | | DB 0 |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#TAB  |Bレジスタの値とカーソルX座標との差だけスペースを表示する。 | AF | |(1FDFH) | |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#LPRNT |Aレジスタの内容をアスキーコードとみなしプリンタのみに出力する。 | AF | |(1FDCH) |プリンタエラーがあった場合は、キャリフラグをセットしてリターンする。 |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#LPTON |上記#PRINT〜#TAB、#PRTHX、#PRTHLの出力をディスプレイだけで| なし | |(1FD9H) |なくプリンタにも出力するかどうかのフラグ#LPTSWをセットする。 |    | | |これをコールしたあとは、上記サブルーチンでプリンタにも |    | | |出力される。 |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#LPTOF |フラグ#LPTSWをリセットする。これをコールしたあとは、    | なし | |(1FD6H) |#PRINT〜#TAB、#PRTHX、#PRTHLの出力を |    | | |ディスプレイのみにする。 |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#GETL |DEレジスタにキー入力バッファの先頭アドレスを入れてコールすると、 | AF | |(1FD3H) |キーボードから1行入力をして文字列をバッファに格納し |    | | |リターンする。エンドコードは00H。 |    | | |途中でSHIFT+BREAKが押されたら、 |    | | |バッファ先頭に1BHが格納される。 |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#GETKY |キーボードからリアルタイムキー入力をする。 | AF | |(1FD0H) |入力したデータはAレジスタに格納され、 |    | | |何も押されていないときは |    | | |Aレジスタタに0をセットしてリターンする。 |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#BRKEY |ブレイクキーが押されているかどうかをチェックする。 | AF | |(1FCDH) |押されているときはゼロフラグをセットしてリターンする。 |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#INKEY |何かキーを押すまでキー入力待ちをし、 | AF | |(1FCAH) |キー入力があるとリターンする。 |    | | |押されたキーのアスキーコードはAレジスタにセットされる。 |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#PAUSE |スペースが押されていれば、 | AF | |(1F07H) |再び何かキーを押すまでリターンしない。 |    | | |このときSHIFT+BREAKを押すと、このルーチンをコールした |    | | |次のアドレスの2バイトの内容を参照し、そこヘジャンプする。 |    | | | 例) CALL #PAUSE |    | | | DW BRKJOB |    | |    |ここでBREAKを押すとBRKJOBヘジャンプ |    | |    |さもなくばDW BRKJOBはスキップ。 |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#BELL |ベル(ビープ音)を鳴らす。 | AF | |(1FC4H) | |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#PRTHX |Aレジスタの内容を16進数2桁で表示する。 | AF | |(1FC1H) | |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#PRTHL |HLレジスタの内容を16進数4桁で表示する。 | AF | |(1FBEH) | |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#ASC  |Aレジスタの下位4ビットの値を16進数を表すアスキーコードに | AF | |(1FBBH) |変換し、Aレジスタにセットする。              |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#HEX  |Aレジスタの内容を16進数を表すアスキーコードとしてバイナリに | AF | |(1FB8H) |変換し、Aレジスタにセットする。Aレジスタの内容が16進数を表す |    | | |アスキーコードでない場合は、キャリフラグをセットしてリターンする。 |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#2HEX |DEレジスタの示すアドレスから2バイトの内容を、2桁の16進数を | AF | |(1FB5H) |表すアスキーコードとしてバイナリに変換し、Aレジスタにセットする。 |DE+2| | |エラーがあった場合はキャリフラグがセットされる。 |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#HLHEX |DEレジスタの示すアドレスから4バイトの内容を、4桁の16進数を | AF | |(1FB2H) |表すアスキーコードとしてバイナリに変換し、HLレジスタにセットする。 | HL | | |エラーがあった場合は、キャリフラグがセットされる。 |DE+4| |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#WOPEN●|#FILEでセットされたファイル名、(#DTADR)、(#SIZE)、(#EXADR)を | AF | |(旧#WRI)|テープに書き込む。ディスクの場合は、新しいファイルかどうかの | BC | |(1FAFH) |チェックを行う。エラー発生時にはキャリフラグが立つ | DE | |    | | HL | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#WRD ●|(#DTADRS)、(#SIZE)、(#EXADR)に従って、デバイスにデータを | 〃  | |(1FACH) |セーブする。ディスクの場合#WOPEN後でないとFile not Openの |    | | |エラーが出る。 |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#FCB ●|テープの場合従来の#RDIとまったく同じ。    | 〃  | |(旧#RDI)|ディスクの場合#DIRNOの値に従って(#IBFAD)にディレクトリの内容を|    | |(1FA9H) |転送する。これにより従来のテープロードルーチンに |    | | |まったく手を加えることなくディスクリードを |    | | |行うことができる。CALL後(#DIRNO)はインクリメントされる。 |    | | |ブレイクキーが押されると(#DIRNO)をクリアする。 |    | | |リターンキーが押されるとキャリフラグを立ててリターンする。 |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#RDD ●|(#DTADRS)、(#SIZE)、(#EXADR)に従って、デバイス上のファイルを| 〃  | |(1FA6H) |読み込む。#ROPEN後でないとFile not Openのエラーが出る。 |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#FILE ●|Aレジスタのファイルのアトリビュート、DEレジスタにファイル名の入っている | 〃  | |(1FA3H) |元頭アドレスをセットしてコールすると(#IBFAD)にファイル名のセットと |    | | |(#DSK)にファイルディスクリプタのセットを行う。 |    | | |ファイルを操作する前には、必ずこのサブルーチンにより、 |    | | |ファイル名とアトリビュートをセットしなければならない。 |    | | |コール後DEレジスタは行の終わり(00H)か:(コロン)の位置を |    | | |示している。 |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#FSAME●|#FILEでセットされたファイルネームと、読み込んだファイルネームを | 〃  | |(1FA0H) |比較する。一致すれぱゼロ、不一致ならばノンゼロでリターンする。|    | | |アトリビュートのチェックも同時に行う。 |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#FRRNT●|テープから読み込んだファイルネームを表示する。スペースキーを押すと | 〃  | |(1F9DH) |表示後一時停止する。 |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#POKE |HLレジスタの内容をオフセットアドレスとして、CIOS用特殊ワークエリアに | なし | |(1F9AH) |Aレジスタの内容を書き込む。 |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#POKE@ |メインメモリからS-OS用特殊ワークエリアにデータを転送する。 | AF | |(1F97H) |HLレジスタにメモリ先頭アドレス、DEレジスタにワークエリアオフセットアドレス、  | BC | |   |エリアオフセットアドレス、BCレジスタにバイト数を入れてコールする。 | DE | | | | HL | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#PEEK |HLレジスタの肉容をオフセットアドレスとして、S-OS用特殊ワークエリアから | AF | |(1F94H) |Aレジスタにデータを読み出す。#POKEと逆の動作。 |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#PEEK@ |S-OS用特殊ワークエリアからメインメモリにデータを転送する。     | AF | |(1F91H) |HL,DE,BCレジスタにセットするパラメータは#POKE@と同じ。 | DE | | | | BC | | | | HL | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#MON |各機種のモニタにジャンプする。 | −  | |(1F8EH) | |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |[HL]  |HLレジスタにコールしたいアドレスを入れ、 | なし | |(1F81H) |  CALL [HL] |    | |    |と使うことにより、擬次的な相対コールが可能。 |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#GETPC |現在のプログラムカウンタの値をHLにコピーする。 | HL | |(1F80H) | |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#DRDSB※|DEが示すレコードナンバーからAが示すレコード数だけ | AF | |(2000H) |HLが示すアドレスに読み込む。連続セクタリード。 | AF’| | |(#DSK)にデバイス(A〜D)をセットしてコールする。      |    | | | LD DE,(#FATPOS) |    | | | LD HL,(#FATBF) |    | | | LD A,1 |    | | | CALL #SCTRD |    | |    |とすれば、FATバッファにFATを読み出すことができる。 |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#DWTSB※|HLが示すアドレスからAレコード分(A×256バイト)の内容を、  | AF | |(2003H) |DEを先頭レコードとして記録する。連続セクタライト。 | AF’| | |(#DSK)にデバイス(A〜D)をセットしてコール。 |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#DIR ※|(#DSK)で指定されたデバイス上の全ディレクトリを表示する。 | AF | |(2006H) | | BC | | | | DE | | | | HL | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#ROPEN※|テープの場合は、先に#FILEでセットされたファイル名と、     | 〃  | |(2009H) |読み込んだIBを比較し、同一ファイルならゼロ、 |    | | |違えばノンゼロでリターンする。 |    | | |ディスクの場合は、#FILEでセットされたファイルが |    | | |ディスク上にあるかどうかのチェックを行う。 |    | | |ゼロフラグは常にリセットとなる。 |    | | |いずれの場合にも、エラーが発生したときにはキャリでリターンする。|    | | |またファイルの情報は、(#DATADR),(#SIZE),(#EXADR)へ |    | | |転送される。 |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#SET ※|#IBDADで示されるIBバッファの内容と一致するディスク上の  | 〃  | |(200CH) |ファイルをライトプロテクトする。 |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#RESET※|#IBDADで示されるIBバッファの内容と一致するファイルの | 〃  | |(200FH) |プロテクトをはずす。 |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#NAME ※|#FILEで設定されたファイル名を、DEレジスタが示すメモリ上のデータに | 〃  | |(2012H) |変える。リネーム。 |    | | |メモリ上のデータ中にデバイスディスクリプタが入っていても無視する。|    | | |またDE+16以内にエンコード(00H,':')がないときには |    | | |エラーが発生する。 |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#KILL ※|#IBFADで示されるIBバッファの内容と一致するディスク上の  | 〃  | |(2015H) |ファイルをキルする。 |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#CSR ※|現在のカーソル位置を、HにY座標、LにX座標の順で | HL | |(2018H) |読み出す。以後、カーソル位置の読み出しは |    | | |必ずこの方法によること。(#XYADR)は使わない |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#SCRN ※|HにY座標、LにX座標をセットしコールすると、 | AF | |(201BH) |画面上の同位置にあるキャラクタをAに読み出す。 |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#LOC ※|HにY座標、LにX座標を入れてコールすると、カーソル位置 | AF | |(201EH) |カーソル位置がそこにセットされる。 |    | | |以後、カーソル位置の設定は必ずこの方法にとること。 |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#FLGET※|カーソル位置で、カーソル点滅1文字入力を行い、Aに押された  | AF | |(2021H) |キャラクタをセット。オートリピートもかかる(MZ-80K/C/1200は不可)。|    | | |画面へのエコーバックは行わない。 |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#RDVSW※|デフォルトデバイスをAに読み出す。デフォルトを知りたいときには | A  | |(2024H) |必ずこの方法によるものとする。 |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#SDVSW※|デフォルトにしたいデバイス名をAに入れコールすると、 | AF | |(2027H) |デフォルトデバイスがセットされる。今後必ずこの方法によること。 |    | | |(#DVSW)を直接触ることも禁止する。 |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#INP ※|共通I/Oポートから1バイトをAに読み込む。 | AF | |(202AH) |ポートはCで指定する。 |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#OUT ※|共通I/OポートへAを出力する。ポートはCで指定する。 | なし | |(202DH) | |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#WIDCH※|画面のモード(40キャラ、80キャラ)を切り替える。 | AF | |(2030H) |Aに40以下の数をセットすると40キャラ、 | BC | | |40より大きい数をセットしてコールすると80キャラとなる。 | DE | | |現在のモードは(#WIDTH)に入っている。         | HL | | |この機能は80K/C/1200/700/1500にはない。 |    | |−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−| |#ERROR※|Aにエラー番号をセットしてコールすることによりエラーメッセージを   | 〃  | |(2033H) |表示する。 |    | ・−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−・ 表6 S−OSのワークエリア ・−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−・ | ワーク名  |           内    容            | |アドレス、バイト数 |                             | |−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−| |#USR    |CIOSをコールドスタートしたあとジャンプするアドレスを示している。 | |(1F7EH-,2バイト)|通常はS-OSのホットスタートのアドレスになっている。 | |−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−| |#DVSW |テープフォーマットなどを切り替えるフラグ。 | |(1F7DH,1バイト) |  0:MZフォーマット2400ボー(共通モード)    | |       |  1:各機種のモニタに依存 | |       |  3:QD(MZ−1500のみ) | |       |コールドスタート時は0になっている。 | |−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−| |#LPSW |#PRINT〜#TAB、#PRTHX、#PRTHLルーチンでの出力をディスプレイだけで | |(1F7CH,1バイト) |なくプリンタにも出力するかどうかのフラグ。 | | |0以外でプリンタにも出力。コールドスタート時は0になっている。 | |−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−| |#PRCNT |改行してから表示した文字数を格納してあるアドレスを示して | |(1F7AH-,2バイト)|いる。 | |−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−| |#XYADR |カーソル座標が格納されているアドレスを示している。   | |(1F78H-,2バイト)| | |−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−| |#KBFAD |各機種のキー入力用バッファのアドレスを示している。 | |(1F76H-,2バイト)| 例) LD DE,(#KBFAD) | |       | CALL #GETL | |−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−| |#IBFAD |インフォメーションブロックの先頭アドレスを示している。 | |(1F74H-,2バイト)|同時にファイルアトリビュートのアドレスでもある。 | |−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−| |#SIZE |ファイルサイズ。#WOPEN、#WRD、#FCB、#RDD、#ROPENルーチンで | |(1F72H-,2バイト)|使用される。 | |−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−| |#DTADR |ファイル先頭アドレス。 | |(1F70H-,2バイト)| | |−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−| |#EXADR |ファイルのエントリアドレス。 | |(1F6EH-,2バイト)| | |−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−| |#STKAD |各機種のモニタが使用しているスタックのアドレスを示している。 | |(1F6CH-,2バイト)| | |−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−| |#MEMAX |S-OSで使用できるメモリの上限を表す。 | |(1F6AH-,2バイト)| | |−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−| |#WKSIZ ※|特殊ワークエリアのサイズを表す。 | |(1F68H-,2バイト)| | |−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−| |#DIRNO ※|#FCBで使用するワーク。このワークに値を入れて#FCBをコールすると、 | |(1F67H,1バイト) |先頭から数えてその値で示されるFCBを(#IBFAD)にロードする。 | | |ロード後、値は1増える。 | |−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−| |#MXTRK ※|使用できる最大トラック数が入っている。 | |(1F66H,1バイト) | | |−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−| |#DTBUF ※|ディスクからデータを読み込む先頭アドレスが入っているデータバッファは | |(1F64H-,2バイト)|256バイト。    | |−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−| |#FATBF ※|ディスクからFATを読み込む先頭アドレスが入っている。 | |(1F62H-,2バイト)|FATバッファは256バイト。 | |−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−| |#DIRPS ※|ディレクトリが入っているレコードナンバーの始まりを示す。 | |(1F60H-,2バイト)|S-OS"SWORD"では10H、書き換えることによって | | |ディレクトリの位置を移動できる。 | |−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−| |#FATPOS ※|ファイルアロケーションテーブル(FAT)が入っているレコードナンバーを示す。 | |(1F5EH-,2バイト)|S-OS"SWORD"では0EH。書き換えることにより | | |FATの位置を移動することができる。 | |−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−| |#DSK ※|アクセスしようとするデバイス名が入る。 | |(1F5DH,1バイト) | | |−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−| |#WIDTH ※|現在のシクリーンモードが入っている。 | |(1F5CH,1バイト) | 40キャラの場合:28H | |       | 80キャラの場合:50H | | |80K/C/1200/700/1500は横40キャラ固定。 | |−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−| |#MAXLIN ※|画面に表示できる最大行数が入っている。 | |(1F5BH,1バイト) | | ・−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−・ ・−−−−−−−−−−−−−−−−−・ |入力について           | ・−−−−−−−−−−−−−−−−−・ S−OS“SWORD”は、X1では BASIC CZ−8CB01/8FB01のモニタ、 MZ−80B/2000/2200/2500では モニタSB−1520またはMZ−1Z001M、 MZ−80K/C/1200/700/1500では ROMモニタ上で動作します。 それぞれのマシン語モニタから入力してください。 なお、プログラムの具体的な入力方法については、 リスト部でそれぞれの場合に分けて詳しく解説されていますので、 そちらを参照してください。 ディスク対応のS−OS“SWORD”と共通I/Oポート。 共通システムの世界はどんどん広がっていきます。 これからも、数多くの提言、アプリケーションなどをお待ちしております。 S−OS“SWORD”の入力方法 1)S−OS“MACE”をお持ちでない方   モニタから、S−OS“SWORD”とDOSモジュール、   ディスクI/Oの3つを打ち込みます。   テープにセーブしたあと、モニタのジャンプ命令を使って   1FFDHにジャンプすれば起動します。 2)S−OSをお持ちの方   S−OS“MACE”をロードし、   変更点と追加部分をモニタのメモリセットコマンドなどを用いて   打ち込みます。   続いてDOSモジュールとディスクI/Oを入力したら   一度テープにセーブし、ジャンプコマンドで実行します。   MACINTO−Sなどのマシン語入力ツールを使用する場合は、   打ち込むオブジェクトと自分自身が重ならないよう注意してください。   たとえばMACINTO−Sを使う場合は次のようにします。   S−OS“MACE”のLコマンドで、   “MACE”を次のアドレスに読み込みます。    X1/C/D/F/turbo        :8500H番地    MZ−80B/2000/2200/2500 :8300H番地    MZ−80K/C/1200/700/1500:8200H番地   MACINTO−Sを7000Hにロードし、   以下の要領で各機種のリストを打ち込みます。    MZ-80K/C/1200/700/1500:ダンプリストの1691H以降を8691H以降に    MZ-80B2/2000/2200/2500:ダンプリストの1573H以降を8573H以降に    X1/C/D/F/turbo :ダンプリストの17CFH以降を87CFH以降に   いずれの場合もダンプリストのアドレスに7000Hを加えればよいので   わかりやすいでしょう。   DOSモジュール、ディスクI/Oも同様に   7000Hを加えたアドレスで打ち込みます。   すべて打ち込み終わったらテープにセーブして、   A000Hから次のとおりに打ち込みます。    MZ-80K/C/1200/700/1500:21 00 82 11 00 12 01 00 1E ED B0 C3 00 12    MZ-80B/2000/2200/2500 :21 00 83 11 00 13 01 00 1D ED B0 C3 00 13    X1/C/D/F/turbo :21 00 85 11 00 15 01 00 1B ED B0 C3 00 15   簡易モニタのJコマンドで、JA000と打ち込めば   “SWORD”が起動します。 3)ディスクをお持ちでない方   DOSモジュールの22B3H〜25ACH、25E3H〜27E2Hと   ディスクI/O(2B00H〜)は打ち込む必要はありません。   そのほかは上の要領と同じです。   すべて打ち込み終わったら表7のテープ専用変更点に従って入力し、   上記のようにA000Hから入力、実行してください。 表7テープ専用変更点 ・−−−−−−−−−−−−−−−−−−−−−−−−・ |アドレス |X1/X1turbo |MZ-80B〜2500|MZ-80K〜1500| |−−−+−−−−−−+−−−−−−+−−−−−−| | 1FA6 |C3 37 1C |C3 3A 1B |C3 EA 13 | | 1FA9 |C3 32 1C |C3 35 1B |C3 C5 13 | | 1FAC |C3 2D 1C |C3 30 1B |C3 AC 13 | | 1FAF |C3 28 1C |C3 2B 1B |C3 87 13 | | 2000 |C9 |C9 |C9 | | 2003 |C9 |C9 |C9 | | 2006 |C3 73 1B |C3 11 19 |C3 D1 1B | | 2009 |C3 18 1B |C3 9E 18 |C3 BA 19 | | 200C |C9 |C9 |C9 | | 200F |C9 |C9 |C9 | | 2012 |C9 |C9 |C9 | | 2015 |C9 |C9 |C9 | ・−−−−−−−−−−−−−−−−−−−−−−−−・ FORMAT&SYSGENの使い方 各機種のディスクBASIC(HuBASIC、S-BASICともに可)付属の ユーティリティを使用して フォーマットをかけたディスケットを用意してください。 FORMAT&SYSGENを実行するとメニュー画面になります。  1)は論理フォーマットをかける、  2)は1)のあと、メモリ上のS−OSをディスケットに    IPLファイルとして登録る。  3)は終了です。 数字で選択してください。 次にデバイスを聞いてきます。 A〜Dで入力してください。 確認でYを押すと実行に入ります。 S−BASICでフォーマットした場合、 1)の論理フォーマットをしてからでないと、 S−OSのディスクとして使うことはできません。 S−BASICのディスクの管理方法がS−OSのものと異なるからです。 また、MZ−80BのBASICの中には70トラックまでしか フォーマットできないものがあります。 この場合、S−OSのワークエリア#MXTRKの値を70(46H)に しておく必要があります。 アプリケーションの実行 S−OS“SWORD”ではこれまでに発表された S−OS“MACE”のアプリケ−ションがすべて動作します。 拡張された機能を生かすためには あとで述べる変更を加えるとより効果的ですが、 基本的には今までのアプリケーションをまったく手直ししなくても ディスク版として動作するようにしてあります。 ZEDAを例に見てみましょう。 ・デバイスの変更は必ずS−OS“SWORD”のモニタから行う ・「E>L??」のように存在しないファイル名でロードしようとすると、  (#DIRNO)に従って次々にファイル名が表示されるので、  ディレクトリを見ることができる。 ・スペースキーを押すと表示が一時停止する。 ・この状態でリターンキーを押すとブレイクされるが、  次にファイル名を与えずにL[CR]とすると、  最後に表示したファイルを読み込むことができる  (このとき、ファイルのアトリビュートはチェックしないので、   JODAN−DOSのファイルをロードすることもできる)。  ポーズ中SHIFT+BREAKでカウンタ(#DIRNO)が0になる。 ・セーブ時に限り、ファイルディスクリプタでデバイスを指定することができる。 注)ファイル名表示のないアプリケーションでは   ファイル名を間違えないよう注意してください。   またLISPはLISPのプログラム専用の   ディスケットを用意する必要があります。